local bouncetimer = 0
local dive = false
local divedirection = 1
addHook("PlayerThink", do
    for player in players.iterate
        if player.mo.skin ~= "fang22"
			return
		end
		if (player.pflags & PF_JUMPED) and not dive  then
			player.mo.state = S_PLAY_FALL
		end
		if bouncetimer > 0 then
			player.mo.state = S_PLAY_BOUNCE
			player.pflags = $1|PF_BOUNCING
			bouncetimer = bouncetimer - 1
			dive = false
		end
		if dive then
			
			player.pflags = $1|PF_GLIDING
			player.pflags = $1|PF_SPINNING
			P_SetObjectMomZ(player.mo, -1*FRACUNIT, true)
			P_Thrust(player.mo, player.mo.angle, divedirection*(FRACUNIT/2))
			if player.powers[pw_pushing] then
				P_Thrust(player.mo, player.mo.angle, player.speed/-2)
				divedirection = divedirection * -1
			end
		end
		if player.mo.z <= player.mo.floorz or player.mo.z >= player.mo.ceilingz then
			dive = false
		end
    end
end)
addHook("AbilitySpecial", do
    for player in players.iterate
        if player.mo.skin ~= "fang22"
			return
		end		
		if (player.cmd.buttons & BT_JUMP) and (player.pflags & PF_JUMPED) and not (player.pflags & PF_JUMPDOWN) then
			bouncetimer = 10
			
			P_SetObjectMomZ(player.mo, -5*FRACUNIT, true)
		end
    end
end)
addHook("SpinSpecial", do
    for player in players.iterate
        if player.mo.skin ~= "fang22"
			return
		end		
		if (player.cmd.buttons & BT_SPIN) and not dive then
			dive = true
			divedirection = 1
			P_SetObjectMomZ(player.mo, 10*FRACUNIT, true)
			P_Thrust(player.mo, player.mo.angle, 5*FRACUNIT)
			player.mo.state = S_PLAY_ROLL
		end
    end
end)